package main_package;

import java.sql.*;
import java.util.Calendar;
import java.util.Vector;

public class Consultas {

    private static Connection conexion;
    
    public Consultas(){
    }
    
    public Consultas(Connection conect) throws SQLException{
        conexion=conect;
    }
    
    public void nuevo_usuario(String dni, String email) throws SQLException{
        PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO Usuario (DNI, Correo) VALUES ('"+dni+"','"+email+"')");
        int resultado=insert.executeUpdate();
        insert.close();
    }

    void añadirPlantilla(int convocatoria, int criterios) throws SQLException {
        PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO Plantillas (Convocatoria, Criterios) VALUES ("+convocatoria+","+criterios+")");
        int resultado=insert.executeUpdate();
        insert.close();
    }

    void añadirCriterio(String nombre, int porcentaje, int plantilla) throws SQLException {
         PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO Criterios (Plantilla, Nombre, Porcentaje) "
                 + "VALUES ("+plantilla+",'"+nombre+"',"+porcentaje+")");
        int resultado=insert.executeUpdate();
        insert.close();
    }

    public int getIdPlantilla(int convocatoria) {
        int nuevo = 0;
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Plantillas Where Convocatoria= "+convocatoria+""
                    );
            ResultSet r=select.executeQuery();
            
            while(r.next()){
                nuevo=r.getInt("IdPlantilla");
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    void añadirConvocatoria(String nombre, String org, String ruta) throws SQLException {
        PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO Convocatoria (Nombre, Organizacion, Ruta) VALUES ('"+nombre+"', '"+org+"','"+ruta+"')");
        int resultado=insert.executeUpdate();
        insert.close();
    }

    int getIdConvocatoria(String ruta) {
        int nuevo = 0;
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Convocatoria Where Ruta= '"+ruta+"'"
                    );
            ResultSet r=select.executeQuery();
            
            while(r.next()){
                nuevo=r.getInt("IdConvocatoria");
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    void añadirComision(String Nombre, int conv, String Fecha, String Estado, String Lugar, int exp) throws SQLException {
        PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO Comision (Convocatoria, Nombre, Fecha, Lugar, Estado,Expertos) "
                + "VALUES ("+conv+", '"+Nombre+"', '"+Fecha+"','"+Lugar+"','"+Estado+"',"+exp+")");
        int resultado=insert.executeUpdate();
        insert.close();
    }
    
    int getIdComision(String nombre) {
        int nuevo = 0;
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Comision Where Nombre= '"+nombre+"'"
                    );
            ResultSet r=select.executeQuery();
            
            while(r.next()){
                nuevo=r.getInt("Id");
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    String getConvocatoria(int conv) {
        String nuevo = null;
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Convocatoria Where IdConvocatoria= "+conv+""
                    );
            ResultSet r=select.executeQuery();
            
            while(r.next()){
                nuevo=r.getString("Nombre");
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    void cerrarComision(int Id) {
        try {
            PreparedStatement update = conexion.prepareStatement(
                  "UPDATE Comision SET Estado='CERRADA' Where Id="+Id);
            update.executeUpdate();
            update.close();
        } catch(Exception e) {
            System.out.println("Error: "+e);
        }
    }
    
    public static  Vector<Convocatoria> listaConvocatorias() throws SQLException{
        Vector<Convocatoria> nuevo= new Vector<Convocatoria>();
        
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Convocatoria");
            ResultSet r=select.executeQuery();
            while(r!=null){
                r.next();
                Convocatoria c = new Convocatoria();
                c.setIdConvocatoria(r.getInt("IdConvocatoria"));
                c.setNombre(r.getString("Nombre"));
                nuevo.add(c);     
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    public Vector<Area> listaAreas() {
        Vector<Area> nuevo= new Vector<Area>();
        
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Areas");
            ResultSet r=select.executeQuery();
            while(r!=null){
                r.next();
                Area c = new Area(r.getInt("IdArea"),r.getString("Nombre"),r.getString("DNI"));
                nuevo.add(c);     
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    void añadirProyecto(String Titulo, String ruta, int Convocatoria, String Area, String Subarea, String Estado) throws SQLException {
        PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO Proyectos (Titulo, Ruta, Convocatoria, area, subarea, estado) "
                + "VALUES ('"+Titulo+"', '"+ruta+"',"+Convocatoria+",'"+Area+"','"+Subarea+"','"+Estado+"')");
        int resultado=insert.executeUpdate();
        insert.close();
    }

    int getIdProyecto(String ruta) {
        int nuevo = 0;
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Proyectos Where Ruta= '"+ruta+"'"
                    );
            ResultSet r=select.executeQuery();
            
            while(r.next()){
                nuevo=r.getInt("IdProyectos");
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    void añadirUsuario(String dni, String nombre, String apellidos, String correo, String rol, String password) throws SQLException {
        PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO Usuario (DNI, Nombre, Apellidos, Correo, Rol, pass) "
                + "VALUES ('"+dni+"', '"+nombre+"','"+apellidos+"','"+correo+"','"+rol+"','"+password+"')");
        int resultado=insert.executeUpdate();
        insert.close();
    }

    public Vector<Usuario> listaUsuariosDeUnaConvocatoria(int convo) {
        Vector<Usuario> nuevo= new Vector<Usuario>();
        
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT DISTINCT DNI, Nombre, Apellidos, Correo "
                    + "FROM Usuario AS U, Invitaciones AS I, Proyectos AS P "
                    + "WHERE (U.DNI=I.Experto AND I.Estado='ASIGNADO' "
                    + "AND I.Proyecto=P.IdProyectos AND P.Convocatoria="+convo+")");
            ResultSet r=select.executeQuery();
            while(r!=null){                
                r.next();
                Usuario c = new Usuario("",this);
                c.setdni(r.getString("DNI"));
                c.setnombre(r.getString("Nombre"));
                c.setapellidos(r.getString("Apellidos"));
                c.setcorreo(r.getString("Correo"));
                nuevo.add(c);     
            }
            r.close();
            select.close();
        }catch(Exception ex){
            System.out.println("Error: "+ex);
        }
        return nuevo;
    }

    void añadirExpertoAComision(String dni, int Id) throws SQLException {
        PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO Comision_Experto (Experto,Comision) "
                + "VALUES ('"+dni+"', "+Id+")");
        int resultado=insert.executeUpdate();
        insert.close();
    }

    public Vector<Comision> listaComisionesAbiertas() {
        Vector<Comision> nuevo= new Vector<Comision>();
        
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT Id, Nombre, Fecha, Lugar, Convocatoria "
                    + "FROM Comision "
                    + "WHERE Estado='ABIERTA'");
            ResultSet r=select.executeQuery();
            while(r!=null){                
                r.next();
                Comision c = new Comision(this);
                c.setIdComision(r.getInt("Id"));
                c.setNombre(r.getString("Nombre"));
                c.setFecha(r.getString("Fecha"));
                c.setLugar(r.getString("Lugar"));
                nuevo.add(c);     
            }
            r.close();
            select.close();
        }catch(Exception ex){
            System.out.println("Error: "+ex);
        }
        return nuevo;
    }

    void actuallizarUsuario(String dni, String correo) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    void actuallizarUsuario(String dni, String dniN, String nombre, String apellidos,
            String fecha_nacimiento, String sexo, String estado_civil, int telefono, 
            String correo, String direccion, String universidad, String estudios,
            String palabras, String entidad_bancaria, int numero_cuenta) {
        try {
            PreparedStatement update = conexion.prepareStatement(
                    "UPDATE Usuario SET DNI='"+dniN+"', Nombre='"+nombre+"', Apellidos='"+apellidos+"', Correo='"+correo+"',"
                    + "Telefono="+telefono+", Fecha_nacimiento='"+fecha_nacimiento+"', Sexo='"+sexo+"',"
                    + "Estado_civil='"+estado_civil+"', Direccion='"+direccion+"', Universidad='"+universidad+"',"
                    + "Estudios='"+estudios+"', Palabras_clave='"+palabras+"',"
                    + "Entidad_bancaria='"+entidad_bancaria+"', Numero_cuenta='"+numero_cuenta+"' "
                    + "Where DNI='"+dni+"'");
            update.executeUpdate();
            update.close();
            } catch(Exception e) {
                    System.out.println("Error: "+e);
            }
    }

    Usuario getUsuario(String username) {
        Usuario nuevo = null;
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Usuario WHERE DNI='"+username+"'"
                    );
            ResultSet r=select.executeQuery();
            
            while(r.next()){
                nuevo=new Usuario();
                nuevo.setdni(r.getString("DNI"));
                nuevo.setnombre(r.getString("Nombre"));
                nuevo.setapellidos(r.getString("Apellidos"));
                nuevo.setcorreo(r.getString("Correo"));
                nuevo.settelefono(r.getInt("Telefono"));
                nuevo.setfecha_nacimiento(r.getString("Fecha_nacimiento"));
                nuevo.setsexo(r.getString("Sexo"));
                nuevo.setestado_civil(r.getString("Estado_civil"));
                nuevo.setdireccion(r.getString("Direccion"));
                nuevo.setuniversidad(r.getString("Universidad"));
                nuevo.setestudios(r.getString("Estudios"));
                nuevo.setentidad_bancaria(r.getString("Entidad_bancaria"));
                nuevo.setpalabras(r.getString("Palabras_clave"));
                nuevo.setnumero_cuenta(r.getInt("Numero_cuenta"));
                nuevo.setpassword(r.getString("pass"));
                nuevo.setRol(r.getString("Rol"));
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }
    public Vector<Integer> consultaLista_Invitaciones(String dni) throws SQLException {
        //int a =consultaNum_invitaciones(dni);
            Vector<Integer> nuevo= new Vector<Integer>();
            try{
                PreparedStatement select=conexion.prepareStatement("SELECT * FROM Invitaciones Where Experto='"+dni+"' and Estado='ESPERANDO_RESPUESTA'");
                ResultSet r=select.executeQuery();
                while(r.next()){
                    nuevo.add(r.getInt("Idinvitaciones"));
                }
                r.close();
                select.close();
            }catch(Exception e){
                System.out.println("Error: "+e);
            }
            return nuevo;
    }
    
    public static int consulta_IdProyectos(int id_invitacion) throws SQLException{
       int nuevo = 0;
        try{
            PreparedStatement select=conexion.prepareStatement("SELECT * FROM Proyectos p, Invitaciones i Where i.Proyecto=p.IdProyectos and i.Idinvitaciones="+id_invitacion);
	            ResultSet r=select.executeQuery();
	            while(r.next()){
	                nuevo=r.getInt("IdProyectos");
	            }
	            r.close();
	            select.close();
	        }catch(Exception e){
	            System.out.println("Error: "+e);
	        }
	        return nuevo;
	     }
    
    public static int consultaConvocatoria(int id_proyecto) throws SQLException{
            int nuevo = 0;
            try{
                PreparedStatement select=conexion.prepareStatement("SELECT c.IdConvocatoria FROM Proyectos p, Convocatoria c Where c.IdConvocatoria=p.Convocatoria and p.IdProyectos = "+id_proyecto);
                ResultSet r=select.executeQuery();
                while(r.next()){
                    nuevo=r.getInt("IdConvocatoria");
                }
                r.close();
                select.close();
            }catch(Exception e){
                System.out.println("Error: "+e);
            }
            return nuevo;
        }

    public String consultaTituloProyecto(int id_proyecto) {
            String nuevo="";
            try{
                PreparedStatement select=conexion.prepareStatement("SELECT * FROM Proyectos Where IdProyectos="+id_proyecto);
                ResultSet r=select.executeQuery();
                while(r.next()){
                    nuevo=r.getString("Titulo");
                }
                r.close();
                select.close();
            }catch(Exception e){
                System.out.println("Error: "+e);
            }
            return nuevo;
    }

    public String getRutaProyecto(int idP) {
        String nuevo="";
            try{
                PreparedStatement select=conexion.prepareStatement("SELECT * FROM Proyectos Where IdProyectos="+idP);
                ResultSet r=select.executeQuery();
                while(r.next()){
                    nuevo=r.getString("Ruta");
                }
                r.close();
                select.close();
            }catch(Exception e){
                System.out.println("Error: "+e);
            }
            return nuevo;
    }

    public int consultarConvocatoria(int idP) {
        int nuevo = 0;
            try{
                PreparedStatement select=conexion.prepareStatement("SELECT * FROM Proyectos Where IdProyectos="+idP);
                ResultSet r=select.executeQuery();
                while(r.next()){
                    nuevo=r.getInt("Convocatoria");
                }
                r.close();
                select.close();
            }catch(Exception e){
                System.out.println("Error: "+e);
            }
            return nuevo;
    }

    public String consultarNombreConvocatoria(int idC) {
        String nuevo = null;
            try{
                PreparedStatement select=conexion.prepareStatement("SELECT * FROM Convocatoria Where IdConvocatoria="+idC);
                ResultSet r=select.executeQuery();
                while(r.next()){
                    nuevo=r.getString("Nombre");
                }
                r.close();
                select.close();
            }catch(Exception e){
                System.out.println("Error: "+e);
            }
            return nuevo;
    }

    public String getRutaConvocatoria(int idC) {
        String nuevo="";
            try{
                PreparedStatement select=conexion.prepareStatement("SELECT * FROM Convocatoria Where IdConvocatoria="+idC);
                ResultSet r=select.executeQuery();
                while(r.next()){
                    nuevo=r.getString("Ruta");
                }
                r.close();
                select.close();
            }catch(Exception e){
                System.out.println("Error: "+e);
            }
            return nuevo;
    }
    
    void actualizar_estadoInvitacion(String estado, String dni, int id_invitacion) {
        try {
            PreparedStatement update = conexion.prepareStatement("UPDATE Invitaciones SET Estado='"+estado+"' Where Experto= '"+dni+"' and Idinvitaciones="+id_invitacion);
            update.executeUpdate();
            update.close();
        } catch(Exception e) {
            System.out.println("Error: "+e);
        }
    }

    public String getUsuarioDeInvitacion(Integer id) {
        String nuevo="";
            try{
                PreparedStatement select=conexion.prepareStatement("SELECT * FROM Invitaciones Where Idinvitaciones="+id);
                ResultSet r=select.executeQuery();
                while(r.next()){
                    nuevo=r.getString("Experto");
                }
                r.close();
                select.close();
            }catch(Exception e){
                System.out.println("Error: "+e);
            }
            return nuevo;
    }

    public Vector<Proyecto> listaProyectosAceptados(String dni) {
        Vector<Proyecto> nuevo= new Vector<Proyecto>();
        
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT DISTINCT * FROM Proyectos p, Invitaciones i WHERE p.IdProyectos=i.Proyecto "
                    + "AND i.Estado = 'ASIGNADO' AND i.Experto='"+dni+"'");
            ResultSet r=select.executeQuery();
            while(r!=null){
                r.next();
                Proyecto c = new Proyecto(this);
                c.setArea(r.getString("area"));
                c.setConvocatoria(r.getInt("Convocatoria"));
                c.setEstado(r.getString("estado"));
                c.setIdProyectos(r.getInt("IdProyectos"));
                c.setRuta(r.getString("Ruta"));
                c.setSubarea(r.getString("subarea"));
                c.setTitulo(r.getString("Titulo"));
                nuevo.add(c);     
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    public Vector<Criterio> getCriteriosPlantilla(int id) {
        Vector<Criterio> nuevo= new Vector<Criterio>();
        
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT DISTINCT * FROM Criterios c, Plantillas p WHERE p.IdPlantilla="+id+" "
                    + "AND c.Plantilla = p.IdPlantilla");
            ResultSet r=select.executeQuery();
            while(r!=null){
                r.next();
                Criterio c = new Criterio(this);
                c.setNombre(r.getString("Nombre"));
                c.setPorcentaje(r.getInt("Porcentaje"));
                c.setPlantilla(r.getInt("Plantilla"));
                nuevo.add(c);     
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    void añadirInformeParcial(String Experto, int Proyecto, String Estado) throws SQLException {
        PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO Informes_parciales (Estado, Experto, Proyecto) "
                + "VALUES ('"+Estado+"', '"+Experto+"',"+Proyecto+")");
        int resultado=insert.executeUpdate();
        insert.close();
    }

    int getIdInformeParcial(int proyecto) {
        int nuevo = 0;
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Informes_parciales Where Proyecto= "+proyecto+""
                    );
            ResultSet r=select.executeQuery();
            
            while(r.next()){
                nuevo=r.getInt("Id_Informeparcial");
            }
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    public void añadirCriterioTemporal(int idIP, int nota, String texto, String nombre) throws SQLException {
        PreparedStatement insert=conexion.prepareStatement(
                "INSERT INTO InformesTemporales (InformeParcial, Nota, Contenido, Criterio) "
                + "VALUES ("+idIP+", "+nota+",'"+texto+"', '"+nombre+"')");
        int resultado=insert.executeUpdate();
        insert.close();
    }
    
    public int existeCriterioTemporal(int idIP){
        int nuevo = 0;
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT COUNT(*) AS Hola FROM InformesTemporales i "
                    + "Where i.InformeParcial="+idIP+"" );
            ResultSet r=select.executeQuery();
            while(r.next()){
                nuevo=r.getInt("Hola");	                
	    };
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    public void actualizarCriterioTemporal(int idIP, int nota, String texto, String nombre) {
        try {
            PreparedStatement update = conexion.prepareStatement(
                  "UPDATE InformesTemporales SET Nota="+nota+", Contenido='"+texto+"' "
                    + "Where InformeParcial="+idIP+" AND Criterio='"+nombre+"'");
            update.executeUpdate();
            update.close();
        } catch(Exception e) {
            System.out.println("Error: "+e);
        }
    }

    public InformeParcial getInformeTemporal(int idIP, String nombre) {
        InformeParcial nuevo = new InformeParcial(this);
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM InformesTemporales i "
                    + "Where i.InformeParcial="+idIP+" AND Criterio='"+nombre+"'" );
            ResultSet r=select.executeQuery();
            while(r.next()){
                nuevo.setContenido(r.getString("Contenido"));	 
                nuevo.setNota(r.getInt("Nota"));
	    };
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }

    public int getIdInformeParcial(String dni, int idP) {
        int nuevo = 0;
        try{
            PreparedStatement select=conexion.prepareStatement(
                    "SELECT * FROM Informes_parciales "
                    + "Where Proyecto="+idP+" AND Experto='"+dni+"'" );
            ResultSet r=select.executeQuery();
            while(r.next()){
                nuevo=r.getInt("Id_Informeparcial");	                
	    };
            r.close();
            select.close();
        }catch(Exception e){
            System.out.println("Error: "+e);
        }
        return nuevo;
    }


}

